【原理】如何理解 Javascript 中的异步?

您所在的位置:网站首页 js 睡眠函数 【原理】如何理解 Javascript 中的异步?

【原理】如何理解 Javascript 中的异步?

2023-04-02 02:18| 来源: 网络整理| 查看: 265

按照惯例先说结论(我自己的理解) = =结论:

JS是⼀⻔单线程的语⾔,这是因为它运⾏在浏览器的渲染主线程中,⽽渲染主线程只有⼀个。⽽渲染主线程承担着诸多的⼯作,渲染⻚⾯、执⾏ JS 都在其中运⾏。如果使⽤同步的⽅式,就极有可能导致主线程产⽣阻塞,从⽽导致消息队列中的很多其他任务⽆法得到执⾏。

这样⼀来,⼀⽅⾯会导致繁忙的主线程⽩⽩的消耗时间,另⼀⽅⾯导致⻚⾯⽆法及时更新,给⽤户造成卡死现象。所以浏览器采⽤异步的⽅式来避免。

具体做法是当某些任务发⽣时,⽐如计时器、⽹络、事件监听,主线程将任务交给其他线程去处理,⾃身⽴即结束任务的执⾏,转⽽执⾏后续代码。当其他线程完成时,将事先传递的回调函数包装成任务,加⼊到消息队列的末尾排队,等待主线程调度执⾏。

在这种异步模式下,浏览器永不阻塞,从⽽最⼤限度的保证了单线程的流畅运⾏。

异步模型图解举例:

可以这么理解,运行在渲染主线程中的 JS 就像是加工厂、消息队列是存放加工原料的仓库(任务队列)、其他进程如“延迟函数”的计时线程等,是原料厂(产出任务)。

加工厂自从建立开始就处于无限循环的状态。每循环一次就会在仓库取走一个原料(处理一个任务),直到 仓库 中没有原料后,加工厂就会放假(主线程休眠)。接着等到 原料厂原料 运送到 仓库 中后,加工厂就会重新上班(主线程激活)。当处理的原料遇到问题时(遇到延迟函数等),就会联系 原料厂 处理,并结束当前 原料 的加工,转而加工下一个原料。原料厂处理完成后重新将原料运到仓库,以此往复。

这样加工厂就会一直处于运转状态,不会因为一个原料的问题,耽误加工厂的运转。这种处理问题的方式就叫做 异步 !!!

结语:

单线程是异步产生的原因,事件循环是异步实现的方式



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3